package com.ruoyi.utils;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.sun.istack.NotNull;

import java.util.HashMap;
import java.util.Map;

public class ALYMessageUtils {
    private static final String defaultSingName = "IKUN体验房";
    private static final String defaultTemplateCode = "SMS_465424439";
    /**
     * 发送短信验证码
     * 参数:
     * @param phoneNumber 接收短信的号码
     * @param code 验证码
     * @param singName 签名名称 默认为[IKUN体验房]
     * @param templateCode 模版编号 默认为[SMS_465424439]
     * 注意: 传递的签名名称和模版名称必须在阿里云中绑定
     * 返回值: 字符串
     *   格式: 响应码,响应消息
     *   响应码:
     *     200: 请求成功
     *     400: 请求失败
     *     401: 服务端错误
     *     402: 客户端错误
     */
    public static String sendCodeMessage(@NotNull String phoneNumber,
                                         @NotNull String code,
                                         String singName,
                                         String templateCode) {
        try {
            //设置超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");

            //初始化ascClient需要的几个参数
            final String product = "Dysmsapi"; // 短信API产品名称（短信产品名固定，无需修改）
            final String domain = "dysmsapi.aliyuncs.com"; // 短信API产品域名（接口地址固定，无需修改）

            final String accessKeyId = "LTAI5tBpShkTv9PMFBBLwZbq"; // accessKeyId
            final String accessKeySecret = "OWLylyrr2Bvz8I6BfTwQrgqIiyLVnK"; // accessKeySecret

            // 初始化ascClient,暂时不支持多region（请勿修改）
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);

            // 组装请求对象
            SendSmsRequest request = new SendSmsRequest();

            // 使用post提交
            request.setMethod(MethodType.POST);

            // 待发送手机号。支持以逗号分隔的形式进行批量调用，批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,
            // 验证码类型的短信推荐使用单条调用的方式；发送国际/港澳台消息时，接收号码格式为00+国际区号+号码，如“0085200000000"
            request.setPhoneNumbers(phoneNumber);

            // 短信签名
            if (singName != null) {
                request.setSignName(singName);
            } else {
                request.setSignName(defaultSingName);
            }

            // 短信模板
            if (templateCode != null) {
                request.setTemplateCode(templateCode);
            } else {
                request.setTemplateCode(defaultTemplateCode);
            }

            // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            request.setTemplateParam("{\"code\":\"" + code + "\"}");

            // 请求失败抛出失败的异常
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
            // 获取请求的状态码 返回自定义的返回码
            if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
                return "200," + sendSmsResponse.getMessage();
            } else {
                return "400," + sendSmsResponse.getMessage();
            }
        } catch (ServerException e) {
            e.printStackTrace();
            return "401,服务端错误";
        } catch (ClientException e) {
            e.printStackTrace();
            return "402,客户端错误";
        }
    }

    /**
     * 发送短信验证码(只需要写两个参数版)
     * @param phoneNumber
     * @param code
     * @return
     */
    public static String sendCodeMessage(@NotNull String phoneNumber, @NotNull String code) {
        return sendCodeMessage(phoneNumber, code, null, null);
    }

    /**
     * 获取一个随机的验证码
     * @param size 验证码长度
     * @return {@code String}
     */
    public static String getCode(int size) {
        //随机${size}位数验证码
        StringBuffer stringBuffer = new StringBuffer();
        for (int x = 0; x < size; x++) {
            int random = (int) (Math.random() * (10 - 1));
            stringBuffer.append(random);
        }
        String code = stringBuffer.toString();
        return code;
    }

    /**
     * 解析返回的结果
     * @param resultStr sendCodeMessage 的返回值
     *        格式: 【自定义code,message】
     * @return
     */
    public static Map<String, String> parseResult(String resultStr) {
        Map<String, String> result = new HashMap<String, String>();
        String[] split = resultStr.split(",");
        result.put("code", split[0]);
        result.put("message", split[1]);
        return result;
    }
}
